/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package compilador.analisadorSintatico.metodos;

import compilador.analisadorLexico.PalavraReservada;
import compilador.analisadorLexico.Token;
import compilador.analisadorLexico.TokenClass;
import compilador.analisadorSintatico.Producao;
import compilador.analisadorSintatico.TokenReader;
import compilador.analisadorSintatico.classe.DEC_VARIAVEL;
import compilador.analisadorSintatico.comandos.CMD;
import compilador.analisadorSintatico.simboloGramatical.NaoTerminal;
import compilador.analisadorSintatico.simboloGramatical.SimboloGramatical;

/**
 *
 * @author nelson
 */
public class EXP_METODO extends Producao {

    @Override
    public SimboloGramatical derivar() throws Exception {
        //pega a instância do tokenReader
        TokenReader tokenReader = TokenReader.getInstance();
        //consome o primeiro token
        Token t = tokenReader.seeCurrent();

        while(! t.getAtributo().equals("}") && tokenReader.hasToken()){
            if (t.getTokenClass().equals(TokenClass.IDENTIFICADOR)) {
                if (tokenReader.seeNext().getAtributo().equals("[")) {
                    if (tokenReader.seeNext(2).getAtributo().equals("]")) {
                        ((NaoTerminal)this.simbolo).add(new DEC_VARIAVEL().derivar());
                        t = tokenReader.seeCurrent();

                    } else {
                        ((NaoTerminal)this.simbolo).add(new CMD().derivar());
                        t = tokenReader.seeCurrent();
                    }
                } else if (tokenReader.seeNext().getTokenClass().equals(TokenClass.IDENTIFICADOR)) {
                    if (tokenReader.seeNext(2).getAtributo().equals("{")) {
                        ((NaoTerminal)this.simbolo).add(new DEC_VARIAVEL().derivar());
                        t = tokenReader.seeCurrent();

                    } else {
                        ((NaoTerminal)this.simbolo).add(new CMD().derivar());
                        t = tokenReader.seeCurrent();
                    }
                } else {
                    ((NaoTerminal)this.simbolo).add(new CMD().derivar());
                    t = tokenReader.seeCurrent();
                }
            } else if (t.getAtributo().equals(PalavraReservada.CHAR) ||
                    t.getAtributo().equals(PalavraReservada.INT)) {

                ((NaoTerminal)this.simbolo).add(new DEC_VARIAVEL().derivar());
                t = tokenReader.seeCurrent();

            /*} else if (t.getAtributo().equals(PalavraReservada.IF) ||
                    t.getAtributo().equals(PalavraReservada.WHILE) ||
                    t.getAtributo().equals(PalavraReservada.BREAK) ||
                    t.getTokenClass().equals(TokenClass.NUMERO) ||
                    t.getAtributo().equals(PalavraReservada.RETURN) ||
                    t.getAtributo().equals(PalavraReservada.WRITE) ||
                    t.getAtributo().equals(PalavraReservada.READ) ||
                    t.getAtributo().equals("(") ||
                    t.getAtributo().equals("-")) {*/
            } else {

                ((NaoTerminal)this.simbolo).add(new CMD().derivar());
                t = tokenReader.seeCurrent();
               
            }
        }
        //retorna um símbolo
        return this.simbolo;
    }

    @Override
    public void setSimbolo() {

        this.simbolo = new NaoTerminal("EXP_METODO");

    }
}